package com.ailanyin.modules.search.service.impl;

import cn.easyes.core.conditions.LambdaEsQueryWrapper;
import cn.hutool.core.collection.ListUtil;
import com.ailanyin.modules.search.domain.TestEs;
import com.ailanyin.modules.search.esmapper.TestEsMapper;
import com.ailanyin.modules.search.mapper.TestMapper;
import com.ailanyin.modules.search.service.TestEsService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author ailanyin
 * @version 1.0
 * @since 2022/9/29 0029 上午 10:01
 */
@Service
public class TestEsServiceImpl implements TestEsService {

    @Resource
    private TestMapper testMapper;
    @Resource
    private TestEsMapper testEsMapper;

    @Override
    public void importDataToEs() {
        // 1. 数据库查询数据
        List<TestEs> list = testMapper.selectAll();
        // 5000每份切割list
        List<List<TestEs>> partition = ListUtil.partition(list, 5000);
        // 2. 导入Es
        for (List<TestEs> testEs : partition) {
            Integer result = testEsMapper.insertBatch(testEs);
            System.out.println("result: " + result);
        }
    }

    @Override
    public TestEs selectById(Long id) {
        return testEsMapper.selectById(id);
    }

    @Override
    public int update(TestEs testEs) {
        return testEsMapper.updateById(testEs);
    }

    @Override
    public int deleteByIds(List<Long> ids) {
        return testEsMapper.deleteBatchIds(ids);
    }

    /**
     * 0. 涉及需要分词匹配的字段索引类型必须为text，并为其指定分词器
     * <p>
     * 1. match
     * 会对输入做分词,只要所有分词中有一个词在内容中有匹配就会查询出该数据,无视分词顺序
     * 2. matchPhase
     * 会对输入做分词，但是需要结果中也包含所有的分词，而且顺序要求一样,
     * 例如es中数据是 技术过硬,如果搜索关键词为过硬技术就无法查询出结果
     * 3. prefixQuery
     * 查询以"隔壁"打头的所有数据  比如隔壁老王 隔壁老汉 都能被查出来
     * 4. multiMatchQuery
     * 从多个指定字段中查询包含老王的数据
     * wrapper.multiMatchQuery("老王", Document::getTitle, Document::getContent, Document::getCreator, Document::getCustomField);
     */
    @Override
    public List<TestEs> search(String param) {

        LambdaEsQueryWrapper<TestEs> wrapper = new LambdaEsQueryWrapper<>();
        // mysql =
        // wrapper.eq(TestEs::getTitle, param);\
        // mysql like
        // wrapper.like(TestEs::getTitle, param);\
        // m = number n = size
        wrapper.limit(1, 10);
        wrapper.matchPhrase(TestEs::getTitle, param);
        return testEsMapper.selectList(wrapper);
    }
}
